//package org.sgx.gwteditors.client.impl1.complex;
//
//import java.util.HashMap;
//import java.util.LinkedList;
//import java.util.List;
//import java.util.Map;
//import java.util.logging.Level;
//import java.util.logging.Logger;
//
//import org.sgx.gwteditors.client.editor.Editor;
//import org.sgx.gwteditors.client.editor.EditorNotFound;
//import org.sgx.gwteditors.client.editor.Types;
//import org.sgx.gwteditors.client.editor.error.EditorError;
//import org.sgx.gwteditors.client.editor.error.EditorErrorManager;
//import org.sgx.gwteditors.client.editor.event.EditorEventManager;
//import org.sgx.gwteditors.client.editor.event.EditorValueChangeEvent;
//import org.sgx.gwteditors.client.editor.event.ValueChangeListener;
//import org.sgx.gwteditors.client.impl1.EditorFramework1;
//import org.sgx.gwteditors.client.impl1.EditorManager1;
//import org.sgx.gwteditors.client.impl1.complex.CopyOfArray1DEditor3.Namer;
//import org.sgx.gwteditors.client.impl1.ui.res.EditorImpl1Resources;
//import org.sgx.jsutil.client.DOMUtil;
//import org.sgx.jsutil.client.DOMUtil.EventHandler;
////import org.sgx.gwteditors.client.impl1.EditorFactoryImpl;
////import org.sgx.gwteditors.client.impl1.bean.SimpleBeanEditor1;
//
//import com.google.gwt.core.client.ScriptInjector;
//import com.google.gwt.dom.client.Style.Cursor;
//import com.google.gwt.event.dom.client.ClickEvent;
//import com.google.gwt.event.dom.client.ClickHandler;
//import com.google.gwt.event.dom.client.HasMouseDownHandlers;
//import com.google.gwt.event.logical.shared.OpenEvent;
//import com.google.gwt.event.logical.shared.OpenHandler;
//import com.google.gwt.user.client.Element;
//import com.google.gwt.user.client.Event;
//import com.google.gwt.user.client.Window;
//import com.google.gwt.user.client.ui.Anchor;
//import com.google.gwt.user.client.ui.Button;
//import com.google.gwt.user.client.ui.DisclosurePanel;
//import com.google.gwt.user.client.ui.FlexTable;
//import com.google.gwt.user.client.ui.HTML;
//import com.google.gwt.user.client.ui.HasVerticalAlignment;
//import com.google.gwt.user.client.ui.HorizontalPanel;
//import com.google.gwt.user.client.ui.Image;
//import com.google.gwt.user.client.ui.Label;
//import com.google.gwt.user.client.ui.VerticalPanel;
//import com.google.gwt.user.client.ui.Widget;
//
///**
// * matrix 2d editor, all members must be same type. This editor is divided in two components, first a simple string list on the left, and a PH editor on the right. When user clicks
// * an item on the list, the right PH editor will be loaded. Also the list supporting adding, deleting and moving the items.
// * 
// * @author sg
// */
//public class CopyOfArray1DEditor3<T> extends FlexTable implements Editor<T[]> {
//
//	public static interface Namer<T> {
//		String getName(T t);
//	}
//
//	static Logger logger = Logger.getLogger(CopyOfArray1DEditor3.class + "");
//	Map<Integer, Editor<T>> eds = null;
//	private T[] model;
//	private String type;
//	private Namer<T> namer;
//	List<Anchor> anchors;
//
//	public CopyOfArray1DEditor3(String type, Namer<T> namer) {
//		super();
//		eds = new HashMap<Integer, Editor<T>>();
//		this.type = type;
//		this.namer = namer;
//		anchors = new LinkedList<Anchor>();
//		initGUI();
//	}
//
//	public CopyOfArray1DEditor3() {
//		initGUI();
//	}
//
//	private FlexTable itemsTable;
//	private FlexTable itemList;
//	private int selectedIndex = -1;
//	protected Editor<T> currentEditor = null;
//
//	private void initGUI() {
//
//		itemsTable = new FlexTable();
//		setWidget(0, 0, itemsTable);
//
//		HorizontalPanel itemlistButtonPanel = new HorizontalPanel();
//		itemlistButtonPanel.setSpacing(4);
//		itemsTable.setWidget(0, 0, itemlistButtonPanel);
//		itemlistButtonPanel.setHeight("100%");
//
//		Image addButton = new Image(EditorImpl1Resources.instance.imageAdd16());
//		addButton.addClickHandler(new ClickHandler() {
//			@Override
//			public void onClick(ClickEvent event) {
//				doAddNewItem();
//			}
//		});
//		addButton.setTitle("Add a new item at the end");
//		addButton.getElement().getStyle().setCursor(Cursor.POINTER);
//
//		itemlistButtonPanel.add(addButton);
//
//		Image deleteButton = new Image(EditorImpl1Resources.instance.imageRemove16());
//		deleteButton.addClickHandler(new ClickHandler() {
//			@Override
//			public void onClick(ClickEvent event) {
//				doDeleteItem();
//			}
//		});
//		itemlistButtonPanel.add(deleteButton);
//		deleteButton.setTitle("Delete selected item");
//		deleteButton.getElement().getStyle().setCursor(Cursor.POINTER);
//
//		Image upButton = new Image(EditorImpl1Resources.instance.imageUpArrow16());
//		upButton.addClickHandler(new ClickHandler() {
//			@Override
//			public void onClick(ClickEvent event) {
//				doMoveItemUp();
//			}
//		});
//		itemlistButtonPanel.add(upButton);
//		upButton.setTitle("Move selected item up");
//		upButton.getElement().getStyle().setCursor(Cursor.POINTER);
//
//		Image downButton = new Image(EditorImpl1Resources.instance.imageDownArrow16());
//		downButton.addClickHandler(new ClickHandler() {
//			@Override
//			public void onClick(ClickEvent event) {
//				doMoveItemDown();
//			}
//		});
//		itemlistButtonPanel.add(downButton);
//		downButton.setTitle("Move selected item down");
//		downButton.getElement().getStyle().setCursor(Cursor.POINTER);
//
//		itemList = new FlexTable();
//		itemsTable.setWidget(1, 0, itemList);
//		itemList.setSize("100%", "100%");
//		getCellFormatter().setVerticalAlignment(0, 0, HasVerticalAlignment.ALIGN_TOP);
//	}
//
//	protected void doMoveItemDown() {
//		if (selectedIndex == -1)
//			Window.alert("You must first select some item");
//		else if (selectedIndex < anchors.size() - 1) {
//			Anchor anchor = anchors.get(selectedIndex);
//			Anchor prevAnchor = anchors.get(selectedIndex + 1);
//			itemList.setWidget(selectedIndex + 1, 0, anchor);
//			itemList.setWidget(selectedIndex, 0, prevAnchor);
//			anchors.set(selectedIndex, prevAnchor);
//			anchors.set(selectedIndex + 1, anchor);
//
//			T selModel = model[selectedIndex], prevModel = model[selectedIndex + 1];
//			model[selectedIndex + 1] = selModel;
//			model[selectedIndex] = prevModel;
//
//			Editor<T> selEd = eds.get(selectedIndex), prevEd = eds.get(selectedIndex + 1);
//			eds.put(selectedIndex, prevEd);
//			eds.put(selectedIndex + 1, selEd);
//
//			// TODO: fire change event
//		}
//	}
//
//	protected void doMoveItemUp() {
//		if (selectedIndex == -1)
//			Window.alert("You must first select some item");
//		else if (selectedIndex > 0) {
//			Anchor anchor = anchors.get(selectedIndex);
//			Anchor prevAnchor = anchors.get(selectedIndex - 1);
//			itemList.setWidget(selectedIndex - 1, 0, anchor);
//			itemList.setWidget(selectedIndex, 0, prevAnchor);
//			anchors.set(selectedIndex, prevAnchor);
//			anchors.set(selectedIndex - 1, anchor);
//
//			T selModel = model[selectedIndex], prevModel = model[selectedIndex - 1];
//			model[selectedIndex - 1] = selModel;
//			model[selectedIndex] = prevModel;
//
//			Editor<T> selEd = eds.get(selectedIndex), prevEd = eds.get(selectedIndex - 1);
//			eds.put(selectedIndex, prevEd);
//			eds.put(selectedIndex - 1, selEd);
//
//			// TODO: fire change event
//		}
//	}
//
//	protected void doDeleteItem() {
//		if (selectedIndex == -1)
//			Window.alert("You must first select some item");
//		else {
//			anchors.remove(selectedIndex);
//			int i = selectedIndex + 1;
//			while (true) {
//				Editor<T> ed = eds.get(i);
//				if (ed == null)
//					break;
//				eds.put(i - 1, ed);
//				itemList.setWidget(i - 1, 0, anchors.get(i));
//				i++;
//			}
//			// TODO: fire change event¡¡¡¡¡¡¡¡¡¡¡
//		}
//	}
//
//	protected void doAddNewItem() {
//		// TODO Auto-generated method stub
//
//	}
//
//	@Override
//	public void addValueChangeListener(ValueChangeListener<T[]> l) {
//		EditorEventManager.<T[]> getInstance().addValueChangeListener(this, l);
//	}
//
//	@Override
//	public void removeValueChangeListener(ValueChangeListener<T[]> l) {
//		EditorEventManager.<T[]> getInstance().addValueChangeListener(this, l);
//	}
//
//	@Override
//	public List<EditorError<T[]>> getErrors() {
//		return EditorErrorManager.<T[]> getInstance().getErrors(this);
//	}
//
//	@Override
//	public T[] flush() {
//		return null;
//	}
//
//	@Override
//	public void load(T[] model) {
//
//		if (model == null)
//			return;
//
//		this.model = model;
//		for (int i = 0; i < model.length; i++) {
//			T o = model[i];
//			if (o == null)
//				continue;
//
//			Anchor anchor = new Anchor(namer.getName(o));
//			anchors.add(anchor);
//
//			itemList.setWidget(i, 0, anchor);
//
//			anchor.addClickHandler(new ClickHandler() {
//				@Override
//				public void onClick(ClickEvent event) {
//					int index = anchors.indexOf(event.getSource());
//					doSetSelected(index);
//
//					// we only create editors when required.
//
//					Editor<T> ed = eds.get(index);
//
//					if (ed == null) {
//						try {
//							ed = Types.getInstance().newEditor(type);// EditorFactoryImpl.<Object>getInstance().getEditorForObject(o);
//							eds.put(index, ed);
//
//						} catch (EditorNotFound e) {
//							T m = _getModel()[index];
//							logger.log(Level.WARNING, " exception building editor for field " + index + ", class: " + m
//									+ " : " + m + ". Cause: " + e.getCause() + " - " + e.getMessage());
//							e.printStackTrace();
//						}
//					}
//					if (ed == null)
//						return;
//
//					// System.out.println("anchor clicked: "+
//					// // event.getSource()+
//					// ", index: "+index+
//					// ", ed: "+ed.hashCode()+
//					// ", model: "+o);
//
//					if (currentEditor != null) {
//						CopyOfArray1DEditor3.this.removeCell(0, 1);
//						currentEditor.getWidget().removeFromParent();
//					}
//
//					currentEditor = ed;
//
//					ed.load(_getModel()[index]);
//					CopyOfArray1DEditor3.this.setWidget(0, 1, ed.getWidget());
//
//					// final Widget w = ed.getWidget();
//
//					// TODO: subeditors events.
//
//					// ed.addValueChangeListener(new ValueChangeListener<T>() {
//					// @Override
//					// public void notifyValueChange(EditorValueChangeEvent<T> evt) {
//					// // System.out.println("notifyValueChange : "+index+", "+
//					// // anchors.get(index)+", namer: "+namer+", val: "+evt.getSrc().flush());
//					// anchors.get(index).setText(namer.getName(evt.getValue()));
//					//
//					// }
//					// });
//					event.preventDefault();
//					// System.out.println("clicked: "+o+" - name: "+name);
//
//					// TODO: fire events
//				}
//			});
//
//		}
//	}
//
//	protected T[] _getModel() {
//		return model;
//	}
//
//	protected void doSetSelected(int index) {
//		selectedIndex = index;
//		for (Anchor a : anchors) {
//			a.getElement().getStyle().setProperty("borderBottom", "0");
//			a.getElement().getStyle().setProperty("backgroundColor", "transparent");
//		}
//		Element el = anchors.get(index).getElement();
//		el.getStyle().setProperty("borderBottom", "1px solid #333333");
//		el.getStyle().setProperty("backgroundColor", "#ededed");
//	}
//
//	@Override
//	public Widget getWidget() {
//		return this;
//	}
//
//	@Override
//	public boolean isSimple() {
//		return false;
//	}
//
//	@Override
//	public String getEditorId() {
//		return EditorManager1.getInstance().getEditorName(this);
//	}
//
//	@Override
//	public String[] getEditorTypesSupported() {
//		return null; 
//	}
//}
